Lietuvių

Išsamiai susipažinkite su pagrindiniais šiukšlių surinkimo algoritmais, kurie varo šiuolaikines vykdymo sistemas, itin svarbūs atminties valdymui ir programų našumui visame pasaulyje.

Vykdymo sistemos: giluminė šiukšlių surinkimo algoritmų analizė

Sudėtingame kompiuterijos pasaulyje vykdymo sistemos yra nematomi varikliai, kurie prikelia mūsų programinę įrangą gyvybei. Jos valdo išteklius, vykdo kodą ir užtikrina sklandų programų veikimą. Daugelio šiuolaikinių vykdymo sistemų šerdyje yra kritiškai svarbus komponentas: šiukšlių surinkimas (ŠS). ŠS yra automatinis atminties, kurios programa nebenaudoja, atlaisvinimo procesas, padedantis išvengti atminties nutekėjimo ir užtikrinti efektyvų išteklių panaudojimą.

Programuotojams visame pasaulyje ŠS supratimas yra ne tik švaresnio kodo rašymas; tai yra apie patikimų, našumo reikalavimus atitinkančių ir keičiamo dydžio programų kūrimą. Ši išsami analizė nagrinės pagrindines sąvokas ir įvairius algoritmus, kurie varo šiukšlių surinkimą, teikdama vertingų įžvalgų įvairių techninių sričių specialistams.

Atminties valdymo būtinybė

Prieš pradedant nagrinėti konkrečius algoritmus, būtina suprasti, kodėl atminties valdymas yra toks svarbus. Tradicinėse programavimo paradigmose kūrėjai rankiniu būdu skiria ir atlaisvina atmintį. Nors tai suteikia tikslų valdymą, tai taip pat yra pagarsėjęs klaidų šaltinis:

Automatinis atminties valdymas, naudojant šiukšlių surinkimą, siekia palengvinti šią naštą. Vykdymo sistema prisiima atsakomybę už nenaudojamos atminties identifikavimą ir atlaisvinimą, leidžianti kūrėjams sutelkti dėmesį į programos logiką, o ne į žemo lygio atminties manipuliavimą. Tai ypač svarbu pasauliniame kontekste, kur įvairios techninės įrangos galimybės ir diegimo aplinkos reikalauja atsparios ir efektyvios programinės įrangos.

Pagrindinės šiukšlių surinkimo sąvokos

Keletas pagrindinių sąvokų yra visų šiukšlių surinkimo algoritmų pagrindas:

1. Pasiekiamumas

Daugelio ŠS algoritmų pagrindinis principas yra pasiekiamumas. Objektas laikomas pasiekiamu, jei yra kelias iš žinomų, „gyvų“ šaknų iki to objekto. Šaknys paprastai apima:

Bet koks objektas, kuris nėra pasiekiamas iš šių šaknų, laikomas šiukšle ir gali būti atlaisvintas.

2. Šiukšlių surinkimo ciklas

Tipiškas ŠS ciklas apima kelias fazes:

3. Pauzės

Didelis iššūkis ŠS yra potencialios „sustabdyti pasaulį“ (STW) pauzės. Per šias pauzes programos vykdymas sustabdomas, kad ŠS galėtų atlikti savo operacijas be trikdžių. Ilgos STW pauzės gali žymiai paveikti programos reakciją, o tai yra kritiškai svarbu vartotojui skirtoms programoms bet kurioje pasaulinėje rinkoje.

Pagrindiniai šiukšlių surinkimo algoritmai

Per daugelį metų buvo sukurti įvairūs ŠS algoritmai, kiekvienas turintis savo stiprybių ir silpnybių. Išnagrinėsime kai kuriuos dažniausiai naudojamus:

1. Žymėjimas ir valymas (Mark-and-Sweep)

Žymėjimo ir valymo algoritmas (Mark-and-Sweep) yra viena seniausių ir pagrindinių ŠS technikų. Jis veikia dviem atskiromis fazėmis:

Privalumai:

Trūkumai:

Pavyzdys: Ankstyvosios Java šiukšlių surinkimo versijos naudojo pagrindinį žymėjimo ir valymo metodą.

2. Žymėjimas ir suspaudimas (Mark-and-Compact)

Siekdamas išspręsti „Mark-and-Sweep“ fragmentacijos problemą, „Mark-and-Compact“ algoritmas prideda trečią fazę:

Privalumai:

Trūkumai:

Pavyzdys: Šis metodas yra daugelio pažangesnių surinkėjų pagrindas.

3. Kopijavimo šiukšlių surinkimas (Copying Garbage Collection)

Kopijavimo ŠS padalija krūvą į dvi erdves: „iš-erdvė“ (From-space) ir „į-erdvė“ (To-space). Paprastai nauji objektai paskiriami „iš-erdvėje“.

Privalumai:

Trūkumai:

Pavyzdys: Dažnai naudojamas „jaunosios“ kartos rinkimui kartų šiukšlių surinkėjuose.

4. Kartų šiukšlių surinkimas (Generational Garbage Collection)

Šis metodas pagrįstas kartų hipoteze, kuri teigia, kad dauguma objektų turi labai trumpą gyvavimo ciklą. Kartų ŠS padalija krūvą į kelias kartas:

Kaip tai veikia:

  1. Nauji objektai paskiriami jaunojoje kartoje.
  2. Mažieji ŠS (dažnai naudojant kopijavimo surinkėją) dažnai atliekami jaunojoje kartoje. Išgyvenę objektai perkeliami į senąją kartą.
  3. Didieji ŠS atliekami rečiau senojoje kartoje, dažnai naudojant „Mark-and-Sweep“ arba „Mark-and-Compact“.

Privalumai:

Trūkumai:

Pavyzdys: Java virtualioji mašina (JVM) plačiai naudoja kartų ŠS (pvz., su surinkėjais, tokiais kaip „Throughput Collector“, CMS, G1, ZGC).

5. Nuorodų skaičiavimas (Reference Counting)

Vietoj pasiekiamumo sekimo, nuorodų skaičiavimas kiekvienam objektui priskiria skaičių, nurodantį, kiek nuorodų rodo į jį. Objektas laikomas šiukšle, kai jo nuorodų skaičius sumažėja iki nulio.

Privalumai:

Trūkumai:

Pavyzdys: Naudojamas Swift (ARC – automatinis nuorodų skaičiavimas), Python ir Objective-C.

6. Inkrementinis šiukšlių surinkimas (Incremental Garbage Collection)

Siekiant dar labiau sumažinti STW pauzių laiką, inkrementiniai ŠS algoritmai atlieka ŠS darbą mažais fragmentais, persipynusios ŠS operacijos su programos vykdymu. Tai padeda išlaikyti trumpą pauzių laiką.

Privalumai:

Trūkumai:

Pavyzdys: „Concurrent Mark Sweep“ (CMS) surinkėjas senesnėse JVM versijose buvo ankstyvas inkrementinio surinkimo bandymas.

7. Lygiagretus šiukšlių surinkimas (Concurrent Garbage Collection)

Lygiagretūs ŠS algoritmai didžiąją dalį savo darbo atlieka lygiagrečiai su programos gijomis. Tai reiškia, kad programa toliau veikia, o ŠS identifikuoja ir atlaisvina atmintį.

Privalumai:

Trūkumai:

Pavyzdys: Šiuolaikiniai surinkėjai, tokie kaip G1, ZGC ir Shenandoah Java kalboje, bei ŠS Go ir .NET Core aplinkose yra labai lygiagretūs.

8. G1 (Garbage-First) surinkėjas

G1 surinkėjas, pristatytas Java 7 ir tapęs numatytuoju Java 9 versijoje, yra serverio stiliaus, regionais pagrįstas, kartų ir lygiagretus surinkėjas, skirtas suderinti pralaidumą ir vėlavimą.

Privalumai:

Trūkumai:

Pavyzdys: Daugelio šiuolaikinių Java programų numatytasis ŠS.

9. ZGC ir Shenandoah

Tai yra naujesni, pažangūs šiukšlių surinkėjai, sukurti ypač trumpam pauzių laikui, dažnai siekiant submilisekundinių pauzių, net ir labai didelėse krūvose (terabaituose).

Privalumai:

Trūkumai:

Pavyzdys: ZGC ir Shenandoah yra prieinami naujausiose OpenJDK versijose ir tinka vėlavimui jautrioms programoms, tokioms kaip finansinių sandorių platformos ar didelio masto žiniatinklio paslaugos, aptarnaujančios pasaulinę auditoriją.

Šiukšlių surinkimas skirtingose vykdymo aplinkose

Nors principai yra universalūs, ŠS įgyvendinimas ir niuansai skiriasi įvairiose vykdymo aplinkose:

Tinkamo ŠS algoritmo pasirinkimas

Tinkamo ŠS algoritmo pasirinkimas yra kritiškai svarbus sprendimas, turintis įtakos programos našumui, keičiamumui ir vartotojo patirčiai. Nėra vieno universalaus sprendimo. Apsvarstykite šiuos veiksnius:

Praktiniai patarimai ŠS optimizavimui

Be tinkamo algoritmo pasirinkimo, galite optimizuoti ŠS našumą:

Šiukšlių surinkimo ateitis

Tęsiamos pastangos siekti dar mažesnio vėlavimo ir didesnio efektyvumo. Būsimi ŠS tyrimai ir plėtra greičiausiai bus sutelkti į:

Išvada

Šiukšlių surinkimas yra šiuolaikinių vykdymo sistemų kertinis akmuo, tyliai valdantis atmintį, kad užtikrintų sklandų ir efektyvų programų veikimą. Nuo pagrindinio „Mark-and-Sweep“ iki ypač mažo vėlavimo ZGC, kiekvienas algoritmas žymi evoliucinį žingsnį atminties valdymo optimizavime. Programuotojams visame pasaulyje, tvirtas šių technikų supratimas suteikia galimybę kurti našesnę, keičiamo dydžio ir patikimesnę programinę įrangą, kuri gali sėkmingai veikti įvairiose pasaulio aplinkose. Suprasdami kompromisus ir taikydami geriausią praktiką, galime išnaudoti ŠS galią kurti naujos kartos išskirtines programas.